# Python趣味编程：第14章　Sprite与Group
# --------------------------
# 程序名: 14-group-sample.py

import pygame

WHITE, RED = ((255, 255, 255), (255, 0, 0))
D = 10
FPS = 20

class Ball(pygame.sprite.Sprite):# ← pygame.sprite.Sprite
    def __init__(self, x, y, vx, vy, color):
        super().__init__() # ←这一行
        self.vx, self.vy = (vx, vy)
        self.image = pygame.Surface((D, D))
        self.image.fill(color)
        self.rect = pygame.Rect(x, y, D, D)

    def update(self):# ← 这个update
        # 移动绘图位置
        self.rect.move_ip(self.vx, self.vy)

    def change_color(self, color):
        self.image.fill(color)

screen = pygame.display.set_mode((640, 320))
clock = pygame.time.Clock()

# 准备球
whites = pygame.sprite.Group()   # ⇦ Group 类
reds = pygame.sprite.Group()     # ⇦ Group 类
whites.add(Ball(100, 100, 10, 0, WHITE))     # ← add 方法
whites.add(Ball(100-100, 200, 10, 0, WHITE)) # ← add 方法
reds.add(Ball(400, 100, -10, 0, RED))        # ← add 方法
reds.add(Ball(400+100, 200, -10, 0, RED))    # ← add 方法

done = False
for i in range(60):
    for event in pygame.event.get():
        # 处理“关闭”按钮
        if event.type == pygame.QUIT: done = True
    if done: break
    clock.tick(FPS)
    reds.update()    # ⇦ update 方法
    whites.update()  # ← update 方法
    collided = pygame.sprite.groupcollide(whites, reds, False, False)
                     # ⇦ 使用 groupcollide 函数，一行就能写出碰撞判断
    if collided != {} : print(collided)   # 调试用
    for white in collided: # 判定冲突后的处理
        white.change_color(RED)
        whites.remove(white)  # remove 方法保持不变
        reds.add(white)       # ← add 方法
    reds.draw(screen)         # ⇦ draw 方法 
    whites.draw(screen)       # ⇦ draw 方法 
    pygame.display.flip()
    screen.fill((0, 0, 0))
pygame.quit()

